package com.example.exception;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.util.SaResult;
import com.example.utils.R;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import static com.example.common.enums.ResultCodeEnum.TOKEN_INVALID_ERROR;

@RestControllerAdvice
public class GlobalExceptionHandler {
    // 全局异常拦截
    @ExceptionHandler
    public SaResult handlerException(Exception e) {
        e.printStackTrace();
        return SaResult.error(e.getMessage());
    }

    /*
     * 自定义异常
     * */
    @ExceptionHandler(CustomException.class)
    @ResponseBody//返回json串
    public R customError(CustomException e) {
        return R.error(e.getCode(), e.getMsg());
    }
    /*
    * 拦截项目中的NotLoginException异常
    * */
    @ExceptionHandler(NotLoginException.class)
    @ResponseBody
    public SaResult handlerNotLoginException(NotLoginException nle) throws Exception {
        // 打印堆栈，以供调试（或者可以用日志框架记录，生产环境不建议直接 printStackTrace）
        nle.printStackTrace();
        // 获取异常类型，避免多次调用 getType() 方法
        String type = nle.getType();
        // 定制化异常信息
        String message;
        switch (type) {
            case NotLoginException.NOT_TOKEN:
                message = "未能读取到有效 token";
                break;
            case NotLoginException.INVALID_TOKEN:
                message = "token 无效";
                break;
            case NotLoginException.TOKEN_TIMEOUT:
                message = "token 已过期";
                break;
            case NotLoginException.BE_REPLACED:
                message = "token 已被顶下线";
                break;
            case NotLoginException.KICK_OUT:
                message = "token 已被踢下线";
                break;
            case NotLoginException.TOKEN_FREEZE:
                message = "token 已被冻结";
                break;
            case NotLoginException.NO_PREFIX:
                message = "未按照指定前缀提交 token";
                break;
            default:
                message = "当前会话未登录";
                break;
        }
        return SaResult.error(message);
    }
}
